package Puntuaciones;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class Estadisticas {

	/**
	 * Variables de instancia
	 */
	// ------------------------------------------------------------------------------------------- //
	private TreeSet<Puntuacion> puntuaciones;// Guardaremos los TIEMPOS y JUGADORES de principiante, intermedio o avanzado, lo que nos haya dicho el jugador
	
	// Estadisticas de principiante, intermedio o avanzado(cada uno tendra sus propias estadisticas: pJ, pG, pP, pV)
	private int partidasJugadas, partidasGanadas, partidasPerdidas;
	private double porcentajeVictorias;
	
	private File fArchivo;// Fichero
	
	/**
	 * Constructor
	 * @throws ExcepcionPuntuaciones 
	 */
	public Estadisticas(char dificultad) throws ExcepcionPuntuaciones{
		// Segun la dificultad que nos pasen, el objeto Estadisticas sera principiante, intermedio o avanzado
		switch (dificultad) {
		case 'p': fArchivo = new File("puntuaciones/principiante.txt");	break;
		case 'i': fArchivo = new File("puntuaciones/intermedio.txt"); break;
		case 'a': fArchivo = new File("puntuaciones/avanzado.txt"); break;

		default:  throw new ExcepcionPuntuaciones("Dificultad No V�lida");
		}
		
		// Inicializar variables de instancia
		puntuaciones = new TreeSet<Puntuacion>();
		partidasJugadas = 0;
		partidasGanadas = 0;
		partidasPerdidas = 0;
		porcentajeVictorias = 0;
	}
	
	/**
	 * Leer (vuelca el contenido del fichero a las variables de instancia)
	 * @throws NumberFormatException 
	 * @throws IOException
	 */
	public void leer() throws NumberFormatException, IOException{// Segun el tipo de dificultad, fArchivo sera de Prin, Inter o Avan.
		// Crear los Objetos necesarios
		String linea="";
		BufferedReader br = new BufferedReader(new FileReader(fArchivo));
		StringTokenizer st;
		
		// Leer pJ, pG, pP, pV
		linea=br.readLine();//Lee la 1� linea que es donde estan estos 4 valores separados por espacios
		st = new StringTokenizer(linea);

		partidasJugadas = Integer.parseInt(st.nextToken());
		partidasGanadas = Integer.parseInt(st.nextToken());
		partidasPerdidas = Integer.parseInt(st.nextToken());
		porcentajeVictorias = Double.parseDouble(st.nextToken());
		
		// Leer tiempos
		byte cont = 0;
		while((linea=br.readLine())!=null && cont<10){// Mientras queden lineas (puntuacion)
			st = new StringTokenizer(linea);
			puntuaciones.add(new Puntuacion(Integer.parseInt(st.nextToken()), st.nextToken()));// Me traigo esa linea
			cont ++;
			
		}
	}
	
	/**
	 * A�adir (1� lee(), despues modifica las vriables de instancia con los datos pasados, finalmente, guarda())
	 * @throws IOException 
	 * @throws NumberFormatException 
	 */
	public void aniadir(Puntuacion p, boolean ganado) throws NumberFormatException, IOException{// recibe una puntuacion y un booleano donde indica si ha ganado o no.
		// Lee la puntuacion del Fichero a las variables de instancia
		puntuaciones.removeAll(puntuaciones);//1� limpio la existente, ya que sino, se duplicaria
		leer();
		
		// Actualiza las Estadisticas
		if(ganado){// si ha ganado
			partidasJugadas++;
			partidasGanadas++;
			porcentajeVictorias = Math.rint(((float)100/(float)partidasJugadas*(float)partidasGanadas)*1000)/1000;//Redondea con 3 decimales
			puntuaciones.add(p);// Solo a�adimos la puntuacion si se ha ganado
		}
		else{// si ha perdido
			partidasJugadas++;
			partidasPerdidas++;
			porcentajeVictorias = Math.rint(((float)100/(float)partidasJugadas*(float)partidasGanadas)*1000)/1000;//Redondea con 3 decimales
		}
		
		
		if( (!ganado && p == null) || (seGuarda(p.getTiempo()) && ganado) )// si se ha perdido y no hay puntuacion o si se ha ganado y seGuarda(t)...
		guardar();// ...Guarda la puntuacion de las variables de instancia en el Fichero
	}
	
	/**
	 * Guardar (vuelca el contenido de las variables de instancia a el fichero)
	 * @throws IOException 
	 */
	private void guardar() throws IOException{
		// Crear los Objetos necesarios
		FileWriter fw = new FileWriter(fArchivo);
		
		// Guardar pJ, pG, pP, pV
		fw.write(partidasJugadas+" "+partidasGanadas+" "+partidasPerdidas+" "+porcentajeVictorias);//Guarda la 1� linea que es donde estan estos 4 valores separados por espacios

		// Guardar tiempos
		Puntuacion p;
		
		Iterator<Puntuacion> i = puntuaciones.iterator();
		int cont=0;
		while(i.hasNext() && cont<10){// Mientras hayan mas puntuaciones y el haya menos de 10 puntuaciones guardadas...
			p = i.next();//... las guardo en una Puntuacion auxiliar...
			puntuaciones.add(p);//A�ado la siguiente puntuacion
			
			fw.write("\n"+p.getTiempo()+" "+p.getNombre());//...y a�ado sus variables
			cont++;
		}	
		if (fw!=null) fw.close();
	}
	
//----------------------------------------------------------------------------------------------------//
	
	/**
	 * Restablecer (pone los registros a 0 y borra todas las puntuaciones)
	 * @throws IOException 
	 */
	public void restablecer() throws IOException{
		puntuaciones.removeAll(puntuaciones);
		partidasJugadas = 0;
		partidasGanadas = 0;
		partidasPerdidas = 0;
		porcentajeVictorias = 0;
		guardar();
	}
		
	/**
	 *  �Se Guarda?
	 *  Indica si hay que guardar una puntuacion o no.
	 * @param puntuacion
	 * @return devuelve true si hay menos de 10 puntuaciones(10 es el m�ximo) o si la puntuacion pasada
	 * como parametro es mayor que la ultima, en cualquier otro caso devuelve false
	 * @throws IOException
	 */
	public boolean seGuarda(int puntuacion) throws IOException{
		
		//Variables necesarias
		int lineas = 0;
		BufferedReader br = new BufferedReader(new FileReader(fArchivo));
		
		// Mientras haya lineas, contarlas
		while(br.readLine() != null){
			lineas++;
		}
		
		// Si hay menos de 11 lineas(la 1� es la de las estadisticas'pj,pg,pp,pv') devuelve verdadero, sino...
		if(lineas < 11) return true;
		else// ...
		{
			br= new BufferedReader(new FileReader(fArchivo));// reiniciar BufferedReader
			// Variables necesarias
			int puntuacionDelUltimo = 0;
			String linea = "";
			StringTokenizer st;
			
			// Extraer la puntuacion del ultimo (del 10�)
			while((linea = br.readLine()) != null){// Mientras haya lineas...
				st = new StringTokenizer(linea);// ...Asignar al StringTokenizer la nueva linea
				puntuacionDelUltimo = Integer.parseInt(st.nextToken());// ...Asignar a la ultima puntuacion la puntuacion de la linea(tiempo)
			}
			
			// Si la puntuacion pasada como parametro es mayor que la del ultimo, devolvemos true, sino, false.
			if(puntuacion < puntuacionDelUltimo) return true;
			else return false;
		}
	}
		
	/**
	 * toString
	 */
	public String toString(){
		String salida="Partidas jugadas: "+partidasJugadas+
				"\nPartidas ganadas: "+partidasGanadas+
				"\nPartidas perdidas: "+partidasPerdidas+
				"\nPorcentaje victoria: "+porcentajeVictorias;
		
		int cont = 1;
		Puntuacion p;
		Iterator<Puntuacion> i = puntuaciones.iterator();
		while(i.hasNext()){
			p = i.next();
			salida += "\n"+cont+"� "+p.getTiempo()+" "+p.getNombre();
			cont++;
		}
		
		
		return salida;
	}
	
	/**
	 * GET
	 */
	public TreeSet<Puntuacion> getPuntuaciones() {return puntuaciones;}
	public int getPartidasJugadas() {return partidasJugadas;}
	public int getPartidasGanadas() {return partidasGanadas;}
	public int getPartidasPerdidas() {return partidasPerdidas;}
	public double getPorcentajeVictorias() {return porcentajeVictorias;}
	public File getfArchivo() {return fArchivo;}
	
	
}
